// 库文件
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include "FreeRTOS.h"
#include "task.h"
#include "cmsis_os2.h"
// HAL库文件
#include "main.h"
// 自定义文件
#include "btnLedTask.h"

extern osEventFlagsId_t buttonEvent; // 外部变量

/* 接口函数：设置LED灯状态 */
void SetButtonLedState(bool state)
{
    HAL_GPIO_WritePin(BTN_LED_GPIO_Port, BTN_LED_Pin, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

/* 接口函数：获取LED灯状态 */
bool GetButtonLedState(void)
{
    return HAL_GPIO_ReadPin(BTN_LED_GPIO_Port, BTN_LED_Pin);
}

/* 中断函数：移动到sys.c文件中 */
// void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
// {
//     if (GPIO_Pin == BUTTON_Pin)
//     {
//         osEventFlagsSet(buttonEvent, 0X0001); // 设置事件标志
//     }
// }

/* 任务函数 */
static void ButtonLedTask(void *argument)
{
    (void)argument;

    uint32_t flags;
    GPIO_PinState readPin;

    while (1)
    {
        // 等待事件标志
        flags = osEventFlagsWait(buttonEvent, 0X0001, osFlagsWaitAny, osWaitForever);

        if (flags & 0X0001) // 检测到按键事件
        {
            osDelay(10); // 按键按下消抖

            // 等待按键释放
            do
            {
                osDelay(10);
                readPin = HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin);
            } while (readPin == GPIO_PIN_RESET);

            osDelay(10); // 按键释放消抖

            // 切换LED状态
            HAL_GPIO_TogglePin(BTN_LED_GPIO_Port, BTN_LED_Pin);

            // 打印LED状态
            if (GetButtonLedState() == GPIO_PIN_SET)
            {
                printf("[ButtonLedTask]LED IS ON!\r\n");
            }
            else
            {
                printf("[ButtonLedTask]LED IS OFF!\r\n");
            }

            osEventFlagsClear(buttonEvent, 0X0001); // 清除事件标志
        }
    }
}

/* 入口函数 */
void ButtonLedTaskEnter(void)
{
    osThreadAttr_t attr = {
        .name = "ButtonLedTask",
        .stack_size = 1024,
        .priority = (osPriority_t)osPriorityNormal};

    // 创建事件标志：移动到sys.c文件中的SYS_Init函数中
    // buttonEvent = osEventFlagsNew(NULL);
    // if (buttonEvent == NULL)
    // {
    //     printf("[ButtonLedExample] Failed to create event flags!\r\n");
    //     return; // 退出任务
    // }

    if (osThreadNew((osThreadFunc_t)ButtonLedTask, (void *)NULL, &attr) == NULL)
    {
        printf("[ButtonLedExample] Failed to create ButtonLEDTask task!\r\n");
        osEventFlagsDelete(buttonEvent); // 删除事件标志
    }
}
